package com.qf.service.impl;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.qf .mapper.SysAttendanceMapper;
import com.qf .domain.SysAttendance;
import com.qf .service.ISysAttendanceService;
import com.qf.system.service.ISysUserService;
/**
 * 考勤Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-11-01
 */
@Service
public class SysAttendanceServiceImpl implements ISysAttendanceService 
{
    @Autowired
    private SysAttendanceMapper sysAttendanceMapper;

    @Autowired
    private ISysUserService sysUserService;

    /**
     * 查询考勤
     * 
     * @param id 考勤主键
     * @return 考勤
     */
    @Override
    public SysAttendance selectSysAttendanceById(Long id)
    {

        return sysAttendanceMapper.selectSysAttendanceById(id);
    }

    /**
     * 查询考勤列表
     * 
     * @param sysAttendance 考勤
     * @return 考勤
     */
    @Override
    public List<SysAttendance> selectSysAttendanceList(SysAttendance sysAttendance)
    {
        List<SysAttendance> sysAttendances = sysAttendanceMapper.selectSysAttendanceList(sysAttendance);
        //调用若依中的方法，根据用户ID查询用户名称
        sysAttendances.forEach(sysAttendance1 -> {
            sysAttendance1.setUserName(sysUserService.selectUserById(sysAttendance1.getUserId()).getNickName());
        });
        System.out.println(sysAttendances);
        return sysAttendances;
    }

    /**
     * 新增考勤
     * 
     * @param sysAttendance 考勤
     * @return 结果
     */
    @Override
    public int insertSysAttendance(SysAttendance sysAttendance) {
        // 初始化状态（默认正常，后续根据时间判断修改）
        Integer status = 1; // 1.正常
        // 标记是否存在迟到/早退（用于判断组合状态）
        boolean isLate = false;   // 迟到标记
        boolean isEarlyLeave = false; // 早退标记

        // 处理上午打卡时间判断（前端已传递morning，直接判断）
        Date morningDate = sysAttendance.getMorning();
        if (morningDate != null) {
            // 转换上午打卡时间为LocalTime（仅保留时分秒）
            LocalTime morningTime = morningDate.toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalTime();

            LocalTime morningDeadline = LocalTime.of(9, 0); // 上午9点截止
            // 上午9点后打卡 → 标记为迟到
            if (morningTime.isAfter(morningDeadline)) {
                isLate = true;
                status = 2; // 先设为单独迟到
            }
        } else {
            // 上午未打卡：判断当前时间是否超过10点 → 上午缺卡（4）
            LocalTime now = LocalTime.now();
            LocalTime morningAbsentDeadline = LocalTime.of(10, 0);
            if (now.isAfter(morningAbsentDeadline)) {
                status = 4; // 上午缺卡
            }
        }

        // 处理下午打卡时间判断（前端已传递afternoon，直接判断）
        Date afternoonDate = sysAttendance.getAfternoon();
        if (afternoonDate != null) {
            // 转换下午打卡时间为LocalTime（仅保留时分秒）
            LocalTime afternoonTime = afternoonDate.toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalTime();

            LocalTime afternoonDeadline = LocalTime.of(18, 0); // 下午6点截止
            // 下午6点前打卡 → 标记为早退
            if (afternoonTime.isBefore(afternoonDeadline)) {
                isEarlyLeave = true;
                // 若之前已是迟到状态，后续结合判断；否则先设为单独早退
                if (!isLate) {
                    status = 3; // 单独早退
                }
            }
        } else {
            // 下午未打卡：判断当前时间是否超过15点（下午3点）→ 下午缺卡（5）
            LocalTime now = LocalTime.now();
            LocalTime afternoonAbsentDeadline = LocalTime.of(15, 0);
            if (now.isAfter(afternoonAbsentDeadline)) {
                // 上午已缺卡 → 全天缺卡（6）；否则 → 下午缺卡（5）
                if (status == 4) {
                    status = 6; // 全天缺卡
                } else {
                    status = 5; // 下午缺卡
                }
            }
        }

        // 核心新增：判断迟到+早退同时存在 → 状态设为23
        if (isLate && isEarlyLeave) {
            status = 23; // 迟到+早退组合状态
        }

        // 设置最终状态到实体类
        sysAttendance.setStatus(status);

        // 插入数据库（若需更新已有记录，可改为调用update方法）
        return sysAttendanceMapper.insertSysAttendance(sysAttendance);
    }

    /**
     * 修改考勤
     * 
     * @param sysAttendance 考勤
     * @return 结果
     */
    @Override
    public int updateSysAttendance(SysAttendance sysAttendance)
    {
        return sysAttendanceMapper.updateSysAttendance(sysAttendance);
    }

    /**
     * 批量删除考勤
     * 
     * @param ids 需要删除的考勤主键
     * @return 结果
     */
    @Override
    public int deleteSysAttendanceByIds(Long[] ids)
    {
        return sysAttendanceMapper.deleteSysAttendanceByIds(ids);
    }

    /**
     * 删除考勤信息
     * 
     * @param id 考勤主键
     * @return 结果
     */
    @Override
    public int deleteSysAttendanceById(Long id)
    {
        return sysAttendanceMapper.deleteSysAttendanceById(id);
    }

    @Override
    public Integer countChecked() {
        return sysAttendanceMapper.countChecked();
    }
}
